/**
 * 游戏状态：Login（登录状态）
 * 
 * 功能说明：
 * - 处理用户登录相关的逻辑
 * - 显示登录界面，处理用户输入
 * - 验证用户身份，建立游戏会话
 * - 为进入主游戏做准备
 * 
 * 设计模式：
 * - 状态模式 (State Pattern)
 * - 继承自BaseState<GameApp>
 * 
 * 生命周期：
 * 1. Enter(): 进入登录状态，显示登录界面
 * 2. Update(): 处理登录逻辑和用户输入
 * 3. Exit(): 退出登录状态，清理资源
 * 
 * 工作流程：
 * 1. 预加载登录UI面板
 * 2. 加载登录场景
 * 3. 显示登录界面
 * 4. 处理用户登录操作
 * 5. 验证成功后切换到主游戏状态
 * 
 * 使用场景：
 * - 用户身份验证
 * - 账号密码登录
 * - 第三方登录集成
 * - 游客登录
 * - 注册新账号
 */

using Game;
using Game.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

namespace GameStates
{
    /**
     * 登录游戏状态
     * 
     * 负责处理用户登录相关的所有逻辑
     * 包括界面显示、用户输入处理、身份验证等
     */
    public class GameStateLogin : BaseState<GameApp>
    {
        /**
         * 进入登录状态
         * 
         * 功能：
         * - 状态被激活时调用
         * - 预加载登录UI面板
         * - 加载登录场景
         * - 显示登录界面
         * 
         * 工作流程：
         * 1. 预加载UILoginPanel
         * 2. 检查UI加载状态
         * 3. 加载Login场景
         * 4. 显示登录面板
         * 
         * 错误处理：
         * - UI加载失败时显示错误提示
         * - 场景加载失败的处理
         */
        public override void Enter()
        {
            Debug.Log("GameStateLogin Enter - 进入登录状态");

            // 注释掉的代码展示了不同的实现方式
            // 1. 直接场景加载方式
            // SceneManager.LoadScene("Login");
            
            // 2. 异步场景加载方式
            // var asyncOperation = SceneManager.LoadSceneAsync("Login", LoadSceneMode.Additive);
            
            // 3. UI预加载 + 场景加载方式（当前使用）
            
            // 预加载登录UI面板
            UIManager.Instance.Preload("UILoginPanel", (prefab) =>
            {
                // 检查UI是否加载成功
                if (UIManager.Instance.IsLoaded("UILoginPanel"))
                {
                    // 加载登录场景
                    SceneManager.LoadScene("Login");

                    // 显示登录UI面板
                    UIManager.Instance.ShowPanel("UILoginPanel");
                }
                else
                {
                    // UI加载失败，显示错误提示
                    Toast.Show($"UI{prefab.name} load failed");
                }
            });

            // 其他实现方式的示例代码（已注释）
            // 1. 场景预加载 + UI显示
            // UIManager.Instance.PreloadPanel("UILoginPanel", (gameObject) => {
            //     SceneManager.LoadScene("Login");
            // });

            // 2. 异步场景加载 + UI显示
            // var currentScene = SceneManager.GetActiveScene().name;
            // var asyncOperation = SceneManager.LoadSceneAsync("Login", LoadSceneMode.Additive);
            // asyncOperation.completed += (operation) => {
            //     UIManager.Instance.ShowPanel("UILoginPanel", (panel) => {
            //         SceneManager.UnloadSceneAsync(currentScene);
            //     });
            // };

            // 3. 协程方式加载
            // GameApp.Instance.StartCoroutine(LoadSceneAsync("Login"));
        }

        /**
         * 异步加载场景的协程方法（示例代码）
         * 
         * 功能：
         * - 异步加载指定场景
         * - 加载完成后显示UI面板
         * - 卸载之前的场景
         * 
         * 参数：
         * - sceneName: 要加载的场景名称
         * 
         * 注意：此方法当前未使用，仅作为示例
         */
        // private IEnumerator LoadSceneAsync(string sceneName)
        // {
        //     // 保存当前场景名称
        //     var currentScene = SceneManager.GetActiveScene().name;

        //     // 异步加载新场景（叠加模式）
        //     var asyncOperation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        //     yield return asyncOperation;

        //     // 异步显示UI面板
        //     var operation = UIManager.Instance.ShowPanelAsync("UILoginPanel");
        //     yield return operation;

        //     // 卸载之前的场景
        //     SceneManager.UnloadSceneAsync(currentScene);
        // }

        /**
         * 退出登录状态
         * 
         * 功能：
         * - 状态被切换时调用
         * - 清理登录相关的资源
         * - 隐藏登录界面
         * - 准备切换到下一个状态
         * 
         * 当前实现：
         * - 输出调试日志
         * 
         * 扩展建议：
         * - 隐藏登录UI面板
         * - 清理登录表单数据
         * - 取消网络请求
         * - 保存登录状态
         */
        public override void Exit()
        {
            Debug.Log("GameStateLogin Exit - 退出登录状态");
            
            // 扩展建议：
            // 1. 隐藏登录UI面板
            // 2. 清理用户输入数据
            // 3. 取消正在进行的网络请求
            // 4. 保存登录成功状态
            // 5. 记录登录时间
        }
    }
}